<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    function Person(name, age) {
        if (!new.target) {
            return new Person(name, age);
        }

        //给Person中的name属性赋值为name形参中的值
        this.name = name;
        this.age = age;

        //会造成内存浪费
        // this.say = function () {
        //     console.log(this.name)
        //     console.log(this.age);
        // }
    }

    // Person.prototype.say = function () {
    //     console.log(this.name)
    //     console.log(this.age);
    // }
    //
    // Person.prototype.move = function () {
    //     console.log("move");
    // }
    //批量添加原型方法
    Person.prototype = {
        say: function () {
            console.log(this.name)
        },
        move: function () {
            console.log("move");
        }
    }


    Person.prototype.money = 100;

    console.dir(Person);
    console.dir(Person.prototype);//函数指向的构造函数
    console.dir(Person.__proto__);//创建这个函数的构造函数
    console.dir(Person.__proto__.__proto__.__proto__);//创建这个函数的构造函数

    let p1 = new Person("haha", 18);
    let p2 = new Person("张三", 28);
    console.dir(p1.prototype);//必须是函数对象才有这个属性
    console.dir(p1.__proto__);//创建p1对象的构造函数
    console.log(Person.prototype === p1.__proto__);

    p1.say();
    p2.say();
    console.log(p1.say === p2.say);
    console.log(p1.money);
    p1.money = 90;//给p1对象添加了一个money属性
    Person.prototype.money = 80;//给Person函数的原型对象上添加了一个money属性

    console.log(p1);
    console.log(p1.money);
    console.log(p2);
    console.log(p2.money);
    //使用for-in循环遍历p2对象
    for (let key in p2) {
        //遍历属性和方法
        console.log(key);
    }

    //只遍历对象自己属性，不能遍历原型上的
    console.log("---------------------")
    for (let key of Object.keys(p2)) {
        console.log(key);
    }

    console.log("---------------------")
    for (let key in p2) {
        if (p2.hasOwnProperty(key)) {
            console.log(key);
        }
    }

    console.log(Person.prototype.constructor === Person);
    //Person.prototype.constructor修改函数创建的对象
    // Person.prototype.constructor = {};
    let p3 = new Person("a", 1);
    console.log(p3);
    p3.say();
    p3.move();

</script>
</body>
</html>